"""
*** 每个部门每个月的数据，形成一张柱状图，每个部门一个颜色，月份在x轴，数量在y轴 ***
"""

import matplotlib.pyplot as plt

# 给定的数据
months = ["一月", "二月", "三月", "四月", "五月", "六月", "七月"]

y = [
    [509, 361, 622, 579, 514, 437, 422],  # 公安
    [96, 71, 124, 141, 128, 67, 67],  # 信访
    [56, 44, 46, 50, 50, 38, 38],  # 劳动仲裁
    [246, 186, 158, 116, 150, 149, 149],  # 劳动监察
    [348, 262, 450, 348, 479, 582, 549],  # 法院
]
labels = ["公安", "信访", "劳动仲裁", "劳动监察", "法院"]
colors = ["red", "blue", "green", "yellow", "purple"]

n_months = len(months)
n_departments = len(y)
index = range(n_months)

# 如何设置x轴的刻度，使得每个部门的数据在x轴上对应的位置不同
# 1. 首先定位每个部门的起始位置，比如第一个部门从0开始，第二个部门起始位置为
# 数据列数*1+1，第三个部门起始位置为数据列数*2+1，以此类推
# 2. 然后计算每个部门的每个数据在x轴上的位置，比如第一个部门的第一个数据在x轴上的位置为0
# ，第二个数据在x轴上的位置为1，以此类推
# 3. 最后将每个部门的每个数据在x轴上的位置形成列表，每个列表对应一个部门的数据
# 4. 将每个部门的每个数据在x轴上的位置列表形成一个大列表，每个位置列表对应一个部门的数据，二层列表
# 5. 在x轴坐标对应的刻度上，将二层列表转换成单层列表，每个点位对应一个中文月份

x = []
for i in [a * (n_months + 1) for a in range(len(labels))]:
    b = [i + a for a in range(n_months)]
    x.append(b)

# [0, 7, 14, 21, 28] 初始定位点
# [
#     [0, 1, 2, 3, 4, 5],
#     [7, 8, 9, 10, 11, 12],
#     [14, 15, 16, 17, 18, 19],
#     [21, 22, 23, 24, 25, 26],
#     [28, 29, 30, 31, 32, 33],
# ] x轴坐标

# 设置图形大小
fig, axs = plt.subplots()  # 生产1个子图

# 计算每个条形的宽度和位置
barWidth = 0.15


# 绘制每个部门的柱状图
for point, data, color, label in zip(x, y, colors, labels):
    v_bar = axs.bar(
        point,
        data,
        width=0.9,  # 应为每个柱间隔为1,所以宽度设置为0.9
        label=label,
        color=color,
        # tick_label=months, # 运行后，只在最后一个部门的x轴上显示月份，出现问题
    )
    # 在每个柱子上显示数值
    # for j, v in zip(point, data):
    #     # 在条形上方添加文本
    #     axs.text(j, v + 0.5, str(v), ha="center", va="bottom")
    axs.bar_label(v_bar, label_type="edge")


# 设置x轴的刻度和标签
axs.set_xlabel("月份", fontsize=12)

pot = []
for i in range(n_departments):
    pot.extend(x[i])
# 将x轴的数据形成列表，每个点位对应一个中文月份
axs.set_xticks(pot, months * n_departments)

# 设置y轴的标签
axs.set_ylabel("数量", fontsize=12)

# 设置图例
axs.legend()

# 设置中文用楷体
plt.rcParams["font.sans-serif"] = ["KaiTi"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号'-'显示为方块的问题

# 显示图形
plt.tight_layout()
plt.show()
